package Map;

import java.util.ArrayList;

/**
 * @author
 * @see Une zoneImpl est de forme rectangulaire. Pour
 * avoir des formes complexes, on doit concaténer des zones rectangulaires
 * ayant le même type de terrain La zone est définie par une largeur et une
 * hauteur. Une zoneImpl est composée de 4 sous-zoneImpl. Par convention, la
 * 1ere zone dans _zones est en position (1,1), la 2e en position (1,2), la
 * 3e en position (2,1) et la 4e en position (2,2). Dans le cas où une
 * zoneImpl possède une largeur = 5 ou une longueur = 5, la liste _zones
 * possède seulement 2 sous-zones. C'est la valeur de la largeur et de la
 * hauteur qui déterminent si la 2e sous-zone doit être placée en dessous ou
 * à côté de la 1ere. Ceci pourrait être à reconsidérer si jamais ça pose
 * problème...
 * 
 *
 */
public class ZoneImpl implements Zone {

	private int _largeur;
	private int _hauteur;
	private ArrayList<Zone> _zones = new ArrayList<Zone>();

	/**
	 * @param largeur
	 * @param hauteur
	 * @param zones
	 */
	public ZoneImpl(int largeur, int hauteur, ArrayList<Zone> zones) {
		_largeur = largeur;
		_hauteur = hauteur;
		_zones = zones;
	}

	/**
	 * @param z
	 */
	public void add(Zone z) {
		_zones.add(z);
	}

	/**
	 * @param z
	 */
	public void remove(Zone z) {
		_zones.remove(z);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see Map.Zone#getNombreTuile()
	 */
	@Override
	public int getNombreTuile() {
		return _zones.size();
	}
	
	public Tuile findTuile(int x, int y) {
		// le premier argument de mat correspond à abcisse (x) et le 2e à l'ordonnee (y)
		if(x < _zones.get(0).getLargeur())
			if(y < _zones.get(0).getHauteur())
				return _zones.get(0).findTuile(x, y);
			else
				return (_zones.get(2)).findTuile(x, y-_zones.get(0).getHauteur());
		else
			if(y < _zones.get(0).getHauteur())
				return (_zones.get(1)).findTuile(x-_zones.get(0).getLargeur(), y);
			else
				return (_zones.get(3)).findTuile(x-_zones.get(0).getLargeur(), y-_zones.get(0).getHauteur());
	}
	
	/* (non-Javadoc)
	 * @see Map.Zone#getLargeur()
	 */
	public int getLargeur() {
		return _largeur;
	}
	
	/* (non-Javadoc)
	 * @see Map.Zone#getHauteur()
	 */
	public int getHauteur() {
		return _hauteur;
	}
	
	/**
	 * @return
	 */
	public ArrayList<Zone> getZones()  {
		return _zones;
	}
}
